# # -*- coding: utf-8 -*-
# # @FileName : app.py
# # @Author   : wangxinyao
# # @Time     : 2025/2/19 09:17
# 2.Web应用的搭建功能性约束
from flask import Flask,request,render_template
from keras.src.utils import load_img,img_to_array
from numpy.ma.core import product

app=Flask(__name__)
@app.route('/')
def home():
    return render_template('home.html')
# 1)图片上传与保存
# 用户可以通过Web界面上传图片文件。
# 上传的文件被保存在服务器的static/images目录下。
# 文件上传功能仅支持POST请求。
import model
models=model.AlexNet()
models.build((None,28,28,-1))
models.summary()
models.load_weights('model.weights.h5')
# 2)图片预处理
# 上传的图片将被转换为灰度图像，并调整尺寸为28x28像素，这是LeNet-5模型所期望的输入尺寸。
# 图片数据被归一化到[0, 1]范围内，这是神经网络模型常见的预处理步骤。
def read_img(path):
    img=load_img(path,target_size=(28,28))
    img=img_to_array(img)
    img=img.reshape(-1,28,28,1)/255
    return img
# 3)模型加载与预测
# 在应用程序启动时，会加载一个预训练的LeNet-5模型，该模型已保存在model.h5文件中。
# 当用户上传图片后，应用程序会使用加载的模型对图片进行分类预测。
# 预测结果是通过找到模型输出中最大概率值的索引来确定的，这个索引对应于手写体数字识别数据集中的一个类别。
import numpy as np
@app.route('/predict',methods=['GET','POST'])
def predict():
    try:
        if request.method=='POST':
            file=request.files['file']
            filename=file.filename
            path='static/'+filename
            file.save(path)
            img=read_img(path)
            predict=models.predict(img)
            predict=np.argmax((predict))
            return render_template('predict.html',user_image=path,product=predict)
        elif request.method=='GET':
            return render_template('predict.html')
    except Exception as e:
        return str(e)
# 4)结果展示
# 预测结果将被映射到具体的类别名称，这些类别名称与手写体数字识别数据集相对应。
# 用户将通过Web界面看到预测结果和他们上传的图片。
# 5)错误处理
# 如果在文件上传、读取或预测过程中发生异常，应用程序将返回一个错误消息，提示用户检查文件扩展名是否正确。
# 6)服务配置与启动
# Flask应用程序配置为在调试模式下运行，这有助于开发过程中的错误追踪。
# 应用程序监听所有IP地址（0.0.0.0）的6008端口。
if __name__ == '__main__':
    app.run(debug=True,host='0.0.0.0',port=6008)
